OneFuzz踩坑教程
本文为看雪论坛优秀文章
看雪论坛作者ID:MinGW
0x00 写在前面
0x01 官方链接
https://github.com/microsoft/onefuzz
https://github.com/microsoft/onefuzz-samples
0x02
特色功能和作用
整理+翻译自微软官方链接资料,可能会有偏差。
0x10 正文-
本地环境安装
0x11 所需下载资料(Windows环境)
0x12 环境安装
https://functionscdn.azureedge.net/public/artifacts/v3/latest/func-cli-x64.msi
https://github.com/microsoft/onefuzz/releases
下载release-artifacts.zip,不要想着去下载源码(Source Code(zip))然后编译,因为源码非常小(<10M),里面很可能没什么核心的东西。
./sdk/里面实际上是2个Python SDK包,2个对应的压缩包,压缩包里面是setup.py形式的安装,SDK包是.whl格式的。如果你想用OneFuzz来进行二次开发,建议你安装上。里面一共有两个文件,建议先安装名字长的那个(onefuzztypes-1.0.0-py3-none-any.whl),再安装名字短的那个(onefuzz-1.0.0-py3-none-any.whl)。别问我为什么。
这里面的东西先不要动,以后会有用的。不过你需要执行一下命令,安装一下requirements.txt里面的依赖包。注意,这一步可能花的时间比较长。
pip install -r requirements.txt
上面的步骤都完成之后,下面就开始踩坑之旅吧。
0x20 正文-
Azure环境配置
0x21 注册Azure云账号
如果网站加载的慢,请记住这个是国外的,访问国外的网站怎么样快这件事我就不用说了吧。
登录好了之后,Azure会要求你验证一系列的东西,比如绑定手机号之类的。不过最重要的就是绑定一张银行卡,如下图:
好了,现在你的信息已经都给了Azure了,你的注册步骤已经完成了。
如果一切无误的话你应该可以回到Azure登录,链接在0x21中,然后JMP 踩坑教程00+0x21,继续点击免费试用。
在使用过程中如果发现微软扣掉了卡里面的$1,这个是微软来检测你的卡是否可用的,为以后的充值做准备。
0x22 进入网页版Azure云平台
链接:https://portal.azure.com/#home
在这里面就可以通过平台方便地管理Azure云里面的内容了。
然后在云平台创建一个资源组,具体方式:
1. 在最上方搜索框里面输入“资源组”,就会出现资源组选项。
2.点击资源组选项,进入资源组界面。
3. 点击左上角的“添加”按钮,进入添加资源组界面。
不建议起中文名字,建议使用英文字母和数字。区域建议选美国东部。(原因在后面的答疑0x61)
4. 下一步是填写标记,在这里面你可以设置一些宏,从而可以实现一些功能,但是我是没用过这个,我都直接跳过了。
5. 下一步就直接创建吧。然后你就能看到资源组列表里面多出来了一个。
0x23 使用命令行进行Azure操作
在整个OneFuzz教程里面,用到的Azure命令并不是很多。如果你准确无误地完成了前面所有步骤的话,那你可以进行以下步骤:
1. 通过管理员命令行输入以下命令(原因在后面的答疑0x62)
az login
这条命令会调用本地Azure端,触发登录,以后就不需要再次登录了,除非更换账号。
执行之后会弹出一个网页,需要你输入账号密码。如果你前面登陆了网页版的Azure云,弹出的网页可能直接会提示你已经登录,只需要点一下自己的账号,就会直接登录,并弹出10秒后跳转Azure CLI帮助文档。
同时,命令行也会返回你账号的json数据。
2. 由于缺少订阅,现在还不能算完成,还需要订阅以下内容:
Microsoft.EventGrid
Microsoft.Network
Microsoft.Compute
az provider show -n Microsoft.EventGrid -o table
然后会返回EventGrid(事件网格,Azure云的一个服务)的订阅状态,如果显示没有订阅,则需要以下命令:
az provider register --namespace Microsoft.EventGrid
然后过一会再输入一遍查询命令,就会返回状态。
同理,对后面的两个订阅内容采用相同的方式订阅。
全部订阅完成之后,Azure云的命令行操作就基本上结束了。
0x30
OneFuzz 环境配置
0x31 OneFuzz deployment
注意:从这一步开始,Azure开始扣你的免费额度了。
现在我们要将OneFuzz部署在云上,如果你前面的步骤都正确无误的话,这一步应该也对你不是问题。这里喜欢探索的同学可能发现了,在onefuzz的github中,./docs/里面好像有一个文件叫做getting-started.md,那里面好像讲了怎么做。
说起来,OneFuzz刚出的那几天,全网没什么教程,我就是仰仗那篇文档踩了一周的坑。因此我决定在我踩完坑之后自己整理一个详细文档,让大家别像我一样踩坑了。
注意:以后的OneFuzz命令最好都要在管理员权限的控制台运行。(原因在后面的答疑0x62)
resource_group为我们前面讲的资源组名称;location为资源组所在地区,例如美国东部为eastus,东南亚为southeastasia,美国东部2为eastus2,当然Azure在全球都有服务器;application_name为你为OneFuzz项目起的名字,会出现在资源组里面;owner即为你自己的邮箱,如果拥有者是你自己的话。
因此,我这里给出的命令为:.
deploy.py eastus caikeng onefuzztutorial 我的邮箱
onefuzz versions check --exact
填坑:你也许忘了你的资源组在美国了,懂我的意思吗?(梯子啊兄弟,梯
0x32 OneFuzz测试实例准备
我修改了一下名字,改成了testprogram,这样会更有辨识度一些。
0x33 OneFuzz的Fuzz环境准备
管理员命令行切到刚刚编译完的文件所在的文件夹,然后执行:
onefuzz pools create 工作池名称 系统类型
onefuzz pools create my-pool linux
onefuzz pools list
创建好之后,过不一会查询一下状态,会显示state:running,那说明完成了。
这个是非常重要的,OneFuzz利用Azure的云计算能力和负载均衡能力,在集群上部署fuzz任务,集群则将任务分配给各个虚拟机,由虚拟机执行fuzz任务。
参考gettting-started.md,命令如下:
onefuzz scalesets create 工作池名称 虚拟机数量 可选参数
onefuzz scalesets create my-pool 4 --vm_sku Standard_B1ms
onefuzz scalesets list
跑起来之后,我们再进行下一步的操作。(原因在后面的答疑0x63)
填坑:我遇到的情况是Azure免费使用套餐里面限制总共虚拟机最多创建4台,创建多了就会失败,查询返回的JSON提示升级套餐或者充值。集群之外创建的虚拟机也会算在里面,所以注意虚拟机的数量。还有可能是虚拟机的配置比较高,导致试用套餐$200 额度不够,这种情况由于我没有选这么好的,暂时没遇到过。如果还有其他情况方便留下言,一起讨论下。
0x40 运行OneFuzz
0x41 创建libfuzzer的工作
onefuzz template libfuzzer basic libfuzzer项目名称 工作名称 build名 工作池名 参数
在这条命令里面,libfuzzer项目名称、工作名称、build名是自己取的,工作池名就是前面定义的工作池。libfuzzer是OneFuzz包含的一个开源fuzz工具,OneFuzz还包含afl,ossfuzz,radamsa。basic是fuzz的模板名,用户可以创建自己的模板,但是现在OneFuzz还没有支持这种功能,所以默认使用OneFuzz内置的basic模板。
onefuzz template libfuzzer basic my-project my-target build_1 my-pool --duration 1 --reboot_after_setup --target_exe ./testprogram --inputs ./seeds/
输入之后就会看到OneFuzz正在根据工作创建blob以及各种各样的任务和容器,然后会上传目标程序和测试用的种子文件。
0x42 上传完成的状态查询
onefuzz tasks list --job_id 返回的job_id
0x43 查看fuzz的输出结果
0x50 OneFuzz
远程调试目标程序
https://github.com/microsoft/onefuzz/blob/main/docs/screencasts/live-debugging.gif
0x60 答疑
0x61 关于国区和国外的问题
https://portal.azure.cn/#home
https://www.cnblogs.com/zangdalei/p/7423020.html
0x62 管理员权限问题
0x63等待集群跑起来之后
onefuzz scalesets list
集群创建失败的原因有很多,比如由于套餐的限制,每个免费套餐最多允许创建4台虚拟机,因而虚拟机集群中如果虚拟机数量大于4,就会提示失败,等等。解决方法就是把多余的虚拟机或者集群全部删除。其他问题我暂时没有遇到。
0x70 写在后面
像OneFuzz调用的那些开源fuzz工具(afl,libfuzzer之类的),它们的工作方式也不过是对测试用例进行各种各样的随机变异,喂给目标程序,统计代码覆盖率罢了。然而测试用例的变异结果无穷无尽,导致整个fuzz过程变成了无限随缘过程,真正能够量化的标准也就只有单位时间内变异的次数(或者喂给目标程序执行的次数)了。
就比如一台机器在单位时间(1小时)内对用例变异了1亿次,另一台机器在单位时间内变异了1万次,很显然变异了1亿次的比1万次的更有可能产生更多的crash,发现更多的漏洞,因为尝试的次数多。
我想,如果我们在本地有强大的计算力,并且我们要做的fuzz工作也不是很复杂,我们根本不需要耗费财力去使用OneFuzz,我们只需要在本地跑一下fuzz工具就可以了。除非真的有特殊需求,我不太建议用OneFuzz。
看雪ID:MinGW
https://bbs.pediy.com/user-home-831588.htm
*本文由看雪论坛 MinGW 原创,转载请注明来自看雪社区。
推荐文章++++
求分享
求点赞
求在看